home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1995 October
/
EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso
/
Aminet
/
misc
/
emu
/
prlink_amiga.lha
/
prlink-0.8.0a
/
src
/
prwfile.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-12
|
5KB
|
225 lines
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "prtrans.h"
#if !defined(__MAIN_C__)
#define main main_prwfile
#endif
#if defined(__MAIN_C__)
unsigned char buffer[256];
#else
extern unsigned char buffer[];
#endif
int main(int argc, char **argv);
int
main(int argc, char **argv)
{
FILE *file = stdout;
int device = 8;
int byte;
char **parameters = argv;
char *remotefile;
char *localfile;
char *portspecified = NULL;
char *prg = "prwfile.prg"; /* loader program file name */
int specified_remotefile = 0;
baseaddr = portaddr[DEFAULT_PORT];
while (*++parameters && **parameters == '-') { /* check for options */
if (parameters[0][1] == '-') { /* "--" ends options */
parameters++;
break;
}
switch (parameters[0][1]) {
case 'd':
device = strtoul (*++parameters, NULL, 0);
if (device > 15) {
fprintf (stderr, "%s: Illegal device number specified.\n", *argv);
return 1;
}
break;
case 'l':
prg = *++parameters;
break;
case 'p':
baseaddr = strtoul (*++parameters, NULL, 16);
if (baseaddr > 3) {
fprintf (stderr, "%s: The printer port number must be between 0 and 3.\n",
*argv);
return 1;
}
portspecified = *parameters;
baseaddr = portaddr[baseaddr];
break;
case '?':
case 'h':
Usage:
fprintf (stderr, "%s: Writes a local file to a file on a remote "
"computer.\n\n", *argv);
fprintf (stderr, "Usage: %s [options] filename [remote filename]\n",
*argv);
fprintf (stderr, "Options:\n\t"
"-d device\t"
"Specify the device number (0-15)\n\t"
"-l filename\t"
"Specify the filename of the client program\n\t"
"-p port\t"
"Specify the printer port (0 to 3)\n");
fprintf (stderr, "The remote filename is converted to PETSCII.\n");
return 1;
default:
fprintf (stderr, "%s: Illegal option `%s'.\n", *argv, *parameters);
goto Usage;
}
}
if (!*parameters) goto Usage;
localfile = *parameters++;
remotefile = strdup(localfile);
if (*parameters) {
remotefile = *parameters++;
specified_remotefile = 1;
}
ascii2petscii(remotefile);
if (!specified_remotefile && localfile[1] == ':') {
localfile += 2; /* strip 0: or 1: from local filename */
}
if (strcmp(localfile, "-") == 0) {
file = stdout;
} else if (!(file = fopen(localfile, "rb"))) {
fprintf (stderr, "%s: Could not open the file `%s'.\n", *argv,
localfile);
return 1;
}
{
int addr;
FILE *f = fopen(prg, "r");
if (f == NULL) {
fprintf (stderr, "%s: Cannot find %s to download\n", *argv, prg);
return 1;
}
addr = fgetc(f);
addr |= fgetc(f) << 8;
fclose(f);
#if defined(__MAIN_C__)
{
char cmd[80];
sprintf(cmd, "prload -j %x ", addr);
if (portspecified) {
strcat (cmd, "-p ");
strcat (cmd, portspecified);
strcat (cmd, " ");
}
strcat (cmd, prg);
fprintf (stderr, "%s\n", cmd);
system(cmd);
}
#else
{
char saddr[10];
sprintf(saddr, "%x", addr);
vmain (main_prload, 4, "prload", "-j", saddr,
portspecified ? "-p", portspecified, prg, NULL : prg, NULL);
}
#endif
}
if (prinit()) {
fprintf (stderr, "%s: Could not get the I/O permissions.\n", *argv);
return 1;
}
if (wait_input ()) {
fprintf (stderr, "%s: not ready to transfer\n", *argv);
return 6;
}
else
fprintf (stderr, "%s: ok to transfer\n", *argv);
byte = strlen(remotefile);
output(byte);
send(remotefile, byte);
output(device);
if ((byte = wait_input ()) != 0) {
fprintf (stderr, "%s: file error %d\n", *argv, byte);
return 1;
}
fprintf(stderr, "Writing %s to %s...\n", localfile, remotefile);
/* loop to send all file blocks */
for (;;) {
int length;
int chksum;
int i;
length = fread(buffer + 1, 1, 255, file);
chksum = 0;
for (i = 0; i < length; i++) {
chksum += buffer[1 + i];
}
buffer[0] = chksum;
for (;;) {
output(length);
if (length == 0)
break; /* end of file */
send(buffer, length + 1);
i = wait_input();
switch (i) {
case 0x80:
goto nextblock;
case 0x81:
fprintf(stderr, "checksum error, resending...\n");
break;
default:
fprintf(stderr, "Aborting\n");
goto abort;
}
}
nextblock:
if (length == 0)
break;
}
abort:
fclose(file);
output(0); /* terminate remote side */
prclose ();
return 0;
}